package com.cqc.jdk8.Jutil;

import com.cqc.util.GsonUtil;
import org.junit.Test;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class Base64Test {

    @Test
    public void f1() throws Exception {
        //加密
        byte[] bytes1 = Base64.getEncoder().encode("前端开发".getBytes(StandardCharsets.UTF_8));
        String encode1 = new String(bytes1);
        //5YmN56uv5byA5Y+R
        System.out.println("encode1=" + encode1);
        String encode2 = new BASE64Encoder().encode("前端开发".getBytes(StandardCharsets.UTF_8));
        System.out.println("encode2=" + encode2);


        //解密
        byte[] bytes = new BASE64Decoder().decodeBuffer(encode2);
        String decode1 = new String(bytes);
        System.out.println("decode1=" + decode1);
    }

    @Test
    public void f2() throws Exception {

        byte[] bytes1 = Base64.getEncoder().encode("前端开发/admin:admin/java".getBytes(StandardCharsets.UTF_8));
        String encode1 = new String(bytes1);


        byte[] bytes2 = new BASE64Decoder().decodeBuffer(encode1);
        String r1 = new String(bytes2);
        //admin:admin
        System.out.println(r1);


    }


    /**
     * Base64Url
     */
    @Test
    public void f3() throws Exception {
        Base64.Encoder urlEncoder = Base64.getUrlEncoder();
        Base64.Decoder urlDecoder = Base64.getUrlDecoder();

        Map<String, Object> map = new HashMap<>();
        map.put("code", 1000);
        map.put("data", "刘亦菲");
        map.put("msg", "成功");
        String json = GsonUtil.toJson(map);

        byte[] encodeArr = urlEncoder.encode(json.getBytes(StandardCharsets.UTF_8));
        String r1 = new String(encodeArr);
        System.out.println("r1=" + r1);

        byte[] decodeArr = urlDecoder.decode(encodeArr);
        String r2 = new String(decodeArr);
        System.out.println("r2=" + r2);
    }


    /**
     Header，声明了 JWT 的签名算法，如 RSA、SHA256 等等，也可能包含 JWT 编号或类型等数据，然后整个信息 Base64 编码即可。
     Payload，通常用来存放一些业务需要但不敏感的信息，如 UserID 等，另外它也有很多默认的字段，如 JWT 签发者、JWT 接受者、JWT 过期时间等等，Base64 编码即可。
     Signature，这个就是一个签名，是把 Header、Payload 的信息用秘钥 secret 加密后形成的，这个 secret 是保存在服务器端的，不能被轻易泄露。
            这样的话，即使一些 Payload 的信息被篡改，服务器也能通过 Signature 判断出来是非法请求，拒绝服务。
     */
    @Test
    public void f4() throws Exception {
        String authorization ="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTg3ODc4NzkxLCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNTg3ODM1NTkxfQ.iUnu3Yhdi_a-Bupb2BLgCTUd5yHL6jgPhkBPorCPvm4";
        byte[] decodeArr = new BASE64Decoder().decodeBuffer(authorization);
        String result = new String(decodeArr);
        System.out.println("result=" + result);

        //{"typ":"JWT","alg":"HS256"}
        String str1 ="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9";
        //{"user_id":1,"username":"admin","exp":1587878791,"email":"admin@admin.com","orig_iat":1587835591}	1
        String str2 ="eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNTg3ODc4NzkxLCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNTg3ODM1NTkxfQ";
        //解不出来
        String str3 ="iUnu3Yhdi_a-Bupb2BLgCTUd5yHL6jgPhkBPorCPvm4";
        System.out.println("str1=" + new String(new BASE64Decoder().decodeBuffer(str1)));//,StandardCharsets.UTF_8
        System.out.println("str2=" + new String(new BASE64Decoder().decodeBuffer(str2)));
        System.out.println("str3=" + new String(new BASE64Decoder().decodeBuffer(str3)));
    }

    /**
     * 保持前后端 Base64一致性用URI
     * @throws Exception
     */
    @Test
    public void f5() throws Exception {
        String result = new URI("XX").getPath();
        System.out.println("result=" + result);
    }
}
